home *** CD-ROM | disk | FTP | other *** search
/ Quick PC 61 / Quick PC 61.iso / I386 / SASETUP.MSI / F77533_inc_accountsgroups.asp < prev    next >
Encoding:
Text File  |  2003-02-21  |  18.8 KB  |  590 lines

  1. <%
  2.  
  3.  
  4.     '-------------------------------------------------------------------------
  5.     ' inc_accountsgroups.asp:    Some common functions for accounts and groups
  6.     '
  7.     ' Copyright (c) Microsoft Corporation.  All rights reserved.
  8.     '
  9.     ' Date             Description
  10.     ' 04/08/2000    Creation date
  11.     '-------------------------------------------------------------------------
  12.  
  13.     'Error Messages
  14.     Dim L_DOMAINFAILED_ERRORMESSAGE
  15.     Dim L_FAILEDTOGETUSERACCOUNTS_ERRORMESSAGE
  16.     Dim L_FAILEDTOGETGROUPACCOUNTS_ERRORMESSAGE
  17.     Dim L_FAILEDTOGETSYSTEMACCOUNTS_ERRORMESSAGE
  18.     Dim L_FAILEDTORETRIEVEMEMBERS_ERRORMESSAGE
  19.  
  20.  
  21.     L_DOMAINFAILED_ERRORMESSAGE  = objLocMgr.GetString("sacoremsg.dll","&HC020004D", varReplacementStrings)
  22.     L_FAILEDTOGETUSERACCOUNTS_ERRORMESSAGE    = objLocMgr.GetString("sacoremsg.dll","&HC020004E", varReplacementStrings)
  23.     L_FAILEDTOGETGROUPACCOUNTS_ERRORMESSAGE = objLocMgr.GetString("sacoremsg.dll","&HC020004F", varReplacementStrings)
  24.     L_FAILEDTOGETSYSTEMACCOUNTS_ERRORMESSAGE = objLocMgr.GetString("sacoremsg.dll","&HC0200050", varReplacementStrings)
  25.     L_FAILEDTORETRIEVEMEMBERS_ERRORMESSAGE= objLocMgr.GetString("sacoremsg.dll","&HC0200051", varReplacementStrings)
  26.  
  27.     'CONSTANTS
  28.  
  29.     'CONST G_strGroupsNotReq = ":CREATOR GROUP SERVER:CREATOR OWNER SERVER:LOCAL:PROXY:"
  30.     'CONST G_strDomainNameNotReq = ":EVERYONE:CREATOR GROUP:CREATOR OWNER:"
  31.     'CONST G_strGroupsReq = "Authenticated Users:TERMINAL SERVER USER"
  32.  
  33.  
  34.     '-------------------------------------------------------------------------
  35.     'Function name:        getGroupsNotReq
  36.     'Description:        gets the groups not required
  37.     'Input Variables:    Connection to the WMI
  38.     'Output Variables:    None
  39.     'Returns:            ":" separaterd string of the groups not required
  40.     '-------------------------------------------------------------------------
  41.     function getGroupsNotReq(objService)
  42.     
  43.         ' The groups (in English) and corresponding Well known SIDs are
  44.         ' CREATOR GROUP SERVER S-1-3-3
  45.         ' CREATOR OWNER SERVER S-1-3-2
  46.         ' LOCAL S-1-2-0
  47.         ' PROXY S-1-5-8
  48.         ' BUILTIN S-1-5-32 (BUILTIN as an win32_SystemAccount object 
  49.         '                    is only on XP, not on W2K server)
  50.         
  51.         Dim arrSid(4)
  52.         
  53.         arrSid(0) = "S-1-3-3"
  54.         arrSid(1) = "S-1-3-2"
  55.         arrSid(2) = "S-1-2-0"
  56.         arrSid(3) = "S-1-5-8"
  57.         arrSid(4) = "S-1-5-32"
  58.         
  59.         getGroupsNotReq = constructNameList(arrSid, objService)
  60.         
  61.     End function
  62.     
  63.     '-------------------------------------------------------------------------
  64.     'Function name:        getDomainNameNotReq
  65.     'Description:        gets the domain names not required
  66.     'Input Variables:    Connection to the WMI
  67.     'Output Variables:    None
  68.     'Returns:            ":" separaterd string of the Domain names not required
  69.     '-------------------------------------------------------------------------
  70.     function getDomainNameNotReq(objService)
  71.     
  72.         ' The Domain names (in English) and corresponding Well known SIDs are
  73.         
  74.         ' EVERYONE S-1-1-0
  75.         ' CREATOR GROUP S-1-3-1 
  76.         ' CREATOR OWNER S-1-3-0
  77.         
  78.         Dim arrSid(2)
  79.         
  80.         arrSid(0) = "S-1-1-0"
  81.         arrSid(1) = "S-1-3-1"
  82.         arrSid(2) = "S-1-3-0"
  83.                 
  84.         getDomainNameNotReq = constructNameList(arrSid, objService)
  85.         
  86.     End function    
  87.     
  88.     '-------------------------------------------------------------------------
  89.     'Function name:        getGroupsReq
  90.     'Description:        gets the groups required
  91.     'Input Variables:    Connection to the WMI
  92.     'Output Variables:    None
  93.     'Returns:            ":" separaterd string of the groups required
  94.     '-------------------------------------------------------------------------
  95.     function getGroupsReq(objService)
  96.     
  97.         ' The groups (in English) and corresponding Well known SIDs are
  98.         ' Authenticated Users S-1-5-11
  99.         ' TERMINAL SERVER USER S-1-5-13
  100.         
  101.         Dim arrSid(1)
  102.         Dim sid
  103.         
  104.         arrSid(0) = "S-1-5-11"
  105.         arrSid(1) = "S-1-5-13"
  106.         
  107.         getGroupsReq = constructNameList(arrSid, objService)
  108.         
  109.         ' Get rid of the begin and end ":"
  110.         getGroupsReq = Mid(getGroupsReq, 2, len(getGroupsReq)-2)
  111.         
  112.     End function
  113.     
  114.     
  115.     '-------------------------------------------------------------------------
  116.     'Function name:        getNTAuthorityDomainName
  117.     'Description:        gets the NT Authority Domain Name for Localization 
  118.     'Input Variables:    Connection to the WMI
  119.     'Output Variables:    None
  120.     'Returns:            string of NT Authority Domain Name
  121.     '-------------------------------------------------------------------------
  122.     function getNTAuthorityDomainName(objService)
  123.     
  124.         Dim strWelKnownSid
  125.         Dim objSid
  126.         
  127.         ' Get the NT Authority Domain name from a well known SID
  128.         strWelKnownSid = "S-1-5-11"
  129.         
  130.         set objSid = objService.Get("Win32_SID.SID=""" & strWelKnownSid & """")
  131.                     
  132.         getNTAuthorityDomainName = objSid.ReferencedDomainName          
  133.         
  134.         set objSid = nothing
  135.         
  136.     End function    
  137.     
  138.     
  139.     '-------------------------------------------------------------------------
  140.     'Function name:        getBuiltinDomainName
  141.     'Description:        gets the BUILTIN Domain Name for Localization 
  142.     'Input Variables:    Connection to the WMI
  143.     'Output Variables:    None
  144.     'Returns:            string of BUILTIN Domain Name
  145.     '-------------------------------------------------------------------------
  146.     function getBuiltinDomainName(objService)
  147.     
  148.         Dim strWelKnownSid
  149.         Dim objSid
  150.         
  151.         ' Get the NT Authority Domain name from a well known SID
  152.         strWelKnownSid = "S-1-5-32"
  153.         
  154.         set objSid = objService.Get("Win32_SID.SID=""" & strWelKnownSid & """")
  155.            
  156.         getBuiltinDomainName = objSid.ReferencedDomainName        
  157.         
  158.         set objSid = nothing
  159.         
  160.     End function
  161.     
  162.     
  163.     '-------------------------------------------------------------------------
  164.     'Function name:        constructNameList
  165.     'Description:        construct a list of Name based on the SIDs
  166.     'Input Variables:    Connection to the WMI
  167.     'Output Variables:    None
  168.     'Returns:            ":" separaterd string of the names
  169.     '-------------------------------------------------------------------------        
  170.     Function constructNameList(arrSid, objService)
  171.     
  172.         Dim sid
  173.         Dim objSid
  174.         
  175.         constructNameList = ":"
  176.         
  177.         ' Get the name for each SID and concatenate it into the list
  178.         For Each sid in arrSid
  179.         
  180.             set objSid = objService.Get("Win32_SID.SID=""" & sid & """")
  181.                     
  182.             constructNameList = constructNameList & objSid.AccountName & ":"
  183.         
  184.         Next
  185.         
  186.         set objSid = nothing
  187.     
  188.     End Function
  189.  
  190.     '-------------------------------------------------------------------------
  191.     'Function name:        getSystemAccounts
  192.     'Description:        gets the system accounts of localmachine
  193.     'Input Variables:    Connection to the WMI
  194.     'Output Variables:    None
  195.     'Returns:            Chr(1) separated string groups in the domain.
  196.     '-------------------------------------------------------------------------
  197.     function getSystemAccounts(objService)
  198.         Err.Clear
  199.  
  200.  
  201.         Dim objCollectionofSystemAccounts
  202.         Dim objSysAcccount
  203.         Dim strQuery
  204.         Dim strSysAcccounts
  205.         Dim strCompName
  206.         Dim arrTemp,i
  207.         Dim strDomainName
  208.         Dim strGroupsNotReq
  209.         Dim strDomainNameNotReq
  210.         Dim strGroupsReq        
  211.         
  212.         strGroupsNotReq = getGroupsNotReq(objService)
  213.         strDomainNameNotReq = getDomainNameNotReq(objService)
  214.         strGroupsReq = getGroupsReq(objService)
  215.  
  216.         strCompName = GetComputerName()
  217.         strSysAcccounts =""
  218.         'strDomainName ="NT Authority"
  219.         strDomainName =getNTAuthorityDomainName(objService)
  220.  
  221.         strQuery = "SELECT Name From Win32_SystemAccount"
  222.  
  223.         Set objCollectionofSystemAccounts = objService.ExecQuery(strQuery)
  224.         If  objCollectionofSystemAccounts.Count = 0 then
  225.             getSystemAccounts = strSysAcccounts
  226.             Exit function
  227.         End if
  228.  
  229.         For each objSysAcccount in objCollectionofSystemAccounts
  230.             if instr(ucase(strGroupsNotReq),":"& ucase(objSysAcccount.Name) &":") = 0 then        
  231.                 if instr(ucase(strDomainNameNotReq),":"& ucase(objSysAcccount.Name) &":") = 0 then    
  232.                     strSysAcccounts = strSysAcccounts & chr(1)& strDomainName &"\"&objSysAcccount.Name &chr(2)&strCompName&"\"&objSysAcccount.Name
  233.                 else                
  234.                     strSysAcccounts = strSysAcccounts & chr(1)& ""&objSysAcccount.Name &chr(2)&strCompName&"\"&objSysAcccount.Name
  235.                 End if
  236.             End if
  237.         Next
  238.  
  239.         arrTemp = split(strGroupsReq,":")
  240.  
  241.         for i= 0 to ubound(arrTemp)
  242.         
  243.             If instr(ucase(strSysAcccounts), ucase(arrTemp(i))) = 0 Then                
  244.                 strSysAcccounts = strSysAcccounts & chr(1)& strDomainName &"\"&arrTemp(i) &chr(2)&strCompName&"\"&arrTemp(i)
  245.             End If
  246.                         
  247.         next
  248.  
  249.         Set objCollectionofSystemAccounts=Nothing
  250.         set objSysAcccount = Nothing
  251.  
  252.         If Err.number  <> 0 Then
  253.             SetErrMsg L_FAILEDTOGETSYSTEMACCOUNTS_ERRORMESSAGE & "(" & Hex(Err.Number)  & ")"
  254.             getSystemAccounts = ""
  255.             Exit Function
  256.         End If
  257.  
  258.         getSystemAccounts = strSysAcccounts
  259.     End Function
  260.  
  261.     '-------------------------------------------------------------------------
  262.     'Function name:        getConnectedDomain
  263.     'Description:        gets the domain in which the machine is present.
  264.     'Input Variables:    Connection to the WMI
  265.     'Output Variables:    None
  266.     'Returns:            Domain Name
  267.     '-------------------------------------------------------------------------
  268.     Function getConnectedDomain(objService)
  269.         Err.Clear
  270.  
  271.         Dim objColletionofSystem
  272.         Dim objSystem
  273.         Dim strDomainName
  274.  
  275.         strDomainName =""
  276.  
  277.         Set objColletionofSystem = objService.InstancesOf ("Win32_ComputerSystem")
  278.  
  279.         For each objSystem in objColletionofSystem
  280.             If objSystem.DomainRole <> 2 Then
  281.                 strDomainName = getShortDomainName(objSystem.Domain)
  282.             End IF
  283.         Next
  284.  
  285.         If Err.number <> 0 then
  286.             SetErrMsg L_DOMAINFAILED_ERRORMESSAGE  & "(" & Hex(Err.Number)  & ")"
  287.             getConnectedDomain = strDomainName
  288.             Exit Function
  289.         End If
  290.         
  291.         getConnectedDomain = strDomainName
  292.                         
  293.     End Function
  294.     
  295.     
  296.     '-------------------------------------------------------------------------
  297.     'Function name:        getShortDomainName
  298.     'Description:        gets the short domain name (vs. DNS name)
  299.     'Input Variables:    domain name that may be a domain DNS name
  300.     'Output Variables:    None
  301.     'Returns:            Short Domain Name
  302.     '-------------------------------------------------------------------------
  303.     Function getShortDomainName(strDomainName)
  304.         Err.Clear        
  305.         Dim arrDomainName
  306.         
  307.         '
  308.         ' If domain name contains char ".", it's a DNS domain name
  309.         ' e.g. redmond.corp.microsoft.com. We need to get the shortname
  310.         ' which is "redmond". That is because ADSI GetObject only accepts 
  311.         ' short domain name.
  312.         '
  313.         If InStr(strDomainName, ".") Then            
  314.             arrDomainName = Split(strDomainName, ".")
  315.             getShortDomainName = arrDomainName(0)        
  316.         Else
  317.             getShortDomainName = strDomainName        
  318.         End If
  319.                         
  320.     End Function
  321.     
  322.  
  323.     '-------------------------------------------------------------------------
  324.     'Function name:        getUserAccounts
  325.     'Description:        gets the users of the given domain.
  326.     'Input Variables:    Connection to the WMI
  327.     '                    Domain name
  328.     'Output Variables:    None
  329.     'Returns:            Chr(1) separated string users in the domain.
  330.     '-------------------------------------------------------------------------
  331.     Function getUserAccounts(objService,strDomain)
  332.         Err.Clear
  333.  
  334.  
  335.         Dim objCollectionofUsers
  336.         Dim objUser
  337.         Dim strQuery
  338.         Dim strUsers
  339.  
  340.         strUsers =""
  341.  
  342.         if Trim(strDomain) = ""  then
  343.             getUserAccounts = strUsers
  344.             Exit function
  345.         end if
  346.  
  347.         strQuery = "SELECT Name From Win32_UserAccount WHERE Domain=" & "'" & strDomain & "'"
  348.  
  349.         Set objCollectionofUsers = objService.ExecQuery(strQuery,"WQL",48,null)
  350.  
  351.         For each objUser in objCollectionofUsers
  352.             strUsers = strUsers & chr(1)& objUser.Name &chr(2) &objUser.Name
  353.         Next
  354.  
  355.         Set objCollectionofUsers=Nothing
  356.         set objUser = Nothing
  357.  
  358.         If Err.number  <> 0 Then
  359.             SetErrMsg L_FAILEDTOGETUSERACCOUNTS_ERRORMESSAGE & "(" & Hex(Err.Number)  & ")"
  360.             getUserAccounts = strUsers
  361.             Exit Function
  362.         End If
  363.         getUserAccounts = strUsers
  364.  
  365.     End Function
  366.  
  367.     '-------------------------------------------------------------------------
  368.     'Function name:        getGroups
  369.     'Description:        gets the groups of the given domain.
  370.     'Input Variables:    Connection to the WMI
  371.     '                    Domain name
  372.     'Output Variables:    None
  373.     'Returns:            Chr(1) separated string groups in the domain.
  374.     '-------------------------------------------------------------------------
  375.     Function getGroups(objService,strDomain)
  376.         Err.Clear
  377.  
  378.  
  379.         Dim objCollectionofGroups
  380.         Dim objGroup
  381.         Dim strQuery
  382.         Dim strGroups
  383.  
  384.         strGroups =""
  385.  
  386.         if Trim(strDomain) = ""  then
  387.             getGroups  = strGroups
  388.             Exit function
  389.         end if
  390.  
  391.         strQuery = "SELECT Name From Win32_Group WHERE Domain=" & "'" & strDomain & "'"
  392.  
  393.         Set objCollectionofGroups = objService.ExecQuery(strQuery,"WQL",48,null)
  394.  
  395.         if not isnull(objCollectionofGroups) then
  396.             For each objGroup in objCollectionofGroups
  397.                 strGroups = strGroups & chr(1)& strDomain & "\" & objGroup.Name & chr(2)& objGroup.Name
  398.             Next
  399.         End if
  400.  
  401.         if Err.number <> 0 then
  402.             SetErrMsg L_FAILEDTOGETGROUPACCOUNTS_ERRORMESSAGE & "(" & Hex(Err.Number)  & ")"
  403.             getGroups = ""
  404.             Exit Function
  405.         End If
  406.  
  407.         getGroups = strGroups
  408.     End Function
  409.  
  410.     '-------------------------------------------------------------------------
  411.     'Function name:        ServetoListBox
  412.     'Description:        gets the groups of the given domain.
  413.     'Input Variables:    Chr(1) separated string groups in the domain.
  414.     'Output Variables:    None
  415.     'Returns:            Output to the listbox
  416.     '-------------------------------------------------------------------------
  417.     Function ServetoListBox(strInput)
  418.         Err.Clear
  419.  
  420.  
  421.         Dim arrInput
  422.         Dim nIndex
  423.         Dim arrTemp
  424.         arrInput = split(strInput,chr(1))
  425.  
  426.         for nIndex = 1 to ubound(arrInput)
  427.  
  428.             if instr(arrInput(nIndex),chr(2)) = 0 then
  429.                 Response.write "<OPTION VALUE=" & Chr(34) & arrInput(nIndex) & Chr(34) & "> " _
  430.                  & arrInput(nIndex) &"</OPTION>"
  431.             else            
  432.                 arrTemp = split(arrInput(nIndex),chr(2))                                
  433.                 Response.write "<OPTION VALUE=" & Chr(34) & arrTemp(0) & Chr(34) & "> " _
  434.                      & arrTemp(1) &"</OPTION>"
  435.             end if
  436.         next
  437.     End Function
  438.  
  439.     '-------------------------------------------------------------------------
  440.     'Function name:        isValidInstance
  441.     'Description:        Checks the instance for valid ness.
  442.     'Input Variables:    objService    - object to WMI
  443.     '                    strClassName    - WMI class name
  444.     '                    strPropertyName    - Property name of the class
  445.     '
  446.     'Output Variables:    None
  447.     'Returns:            Returns true on Valid Instance ,
  448.     '                    False on invalid and also on Error
  449.     ' Checks whether the given instance is valid in WMI.Returns true on valid
  450.     ' false on invalid or Error.
  451.     '-------------------------------------------------------------------------
  452.     Function isValidInstance(objService,strClassName,strPropertyName)
  453.         Err.Clear
  454.  
  455.  
  456.         Dim strInstancePath
  457.         Dim objInstance
  458.  
  459.         On Error Resume Next
  460.  
  461.         strInstancePath = strClassName & "." & strPropertyName
  462.  
  463.         Set objInstance = objservice.Get(strInstancePath)
  464.  
  465.         if NOT isObject(objInstance) or Err.number <> 0 Then
  466.             isValidInstance = FALSE
  467.             Err.Clear
  468.         Else
  469.             isValidInstance = TRUE
  470.         End If
  471.     End Function
  472.  
  473.     '---------------------------------------------------------------------
  474.     ' Function name:    getLocalUsersList
  475.     ' Description:        Gets the members of the logon domain
  476.     ' Input Variables:    WMI Connection
  477.     ' Output Variables:    None
  478.     ' Returns:            chr(1) seperated members of the connected domain
  479.     ' Global Variables: In: L_(*)
  480.     '---------------------------------------------------------------------
  481.     Function getLocalUsersList(objService)
  482.         Err.Clear
  483.  
  484.  
  485.         Dim strGroupsNUsers
  486.         'Dim strDomain
  487.         Dim strCompName
  488.         Dim strTemp
  489.  
  490.         'Intialization of the variables to get the domain & computer name
  491.         strTemp= ""
  492.         strGroupsNUsers    = ""
  493.         'strDomain = getConnectedDomain(objService)
  494.         strCompName= GetComputerName()
  495.  
  496.         'Get the members of the local system
  497.         strTemp = getUserAccounts(objService,strCompName)
  498.         strTemp    =replace(strTemp,chr(1),(chr(1)&strCompName &"\"))
  499.         strGroupsNUsers     = getSystemAccounts(objService) & strTemp
  500.         strGroupsNUsers  = replace(strGroupsNUsers, chr(2)& UCASE(strCompName) &"\",chr(2))
  501.         
  502.         if Err.number <> 0 then
  503.             ServeFailurePage L_FAILEDTORETRIEVEMEMBERS_ERRORMESSAGE & "(" & Hex(Err.number) & ")"
  504.         End if
  505.  
  506.         getLocalUsersList = strGroupsNUsers
  507.     End Function
  508.  
  509.     '---------------------------------------------------------------------
  510.     ' Function name:    getLocalUsersListEx
  511.     ' Description:        Gets the members of the logon domain
  512.     ' Input Variables:    WMI Connection
  513.     '            intType 
  514.     '                Type - 0 for all users
  515.     '                Type - 1 for system/builtin users
  516.     '                Type - 2 for normal users
  517.     ' Output Variables:    None
  518.     ' Returns:            chr(1) seperated members of the connected domain
  519.     ' Global Variables: In: L_(*)
  520.     '---------------------------------------------------------------------
  521.     Function getLocalUsersListEx(objService,intType)
  522.         Err.Clear
  523.  
  524.         Dim strGroupsNUsers
  525.         'Dim strDomain
  526.         Dim strCompName
  527.         Dim strTemp
  528.  
  529.         'Intialization of the variables to get the domain & computer name
  530.         strTemp= ""
  531.         strGroupsNUsers    = ""
  532.         'strDomain = getConnectedDomain(objService)
  533.         strCompName= GetComputerName()
  534.  
  535.         'Get the members of the local system
  536.         if (intType=1 or intType=0) Then
  537.             strTemp = getSystemAccounts(objService)
  538.             strGroupsNUsers     = strGroupsNUsers & strTemp
  539.         end if
  540.         if (intType=2 or intType=0) Then
  541.             strTemp = getUserAccounts(objService,strCompName)
  542.             strTemp    =replace(strTemp,chr(1),(chr(1)&strCompName &"\"))
  543.             strGroupsNUsers     = strGroupsNUsers & strTemp
  544.         end if
  545.         strGroupsNUsers  = replace(strGroupsNUsers, chr(2)& UCASE(strCompName) &"\",chr(2))
  546.         
  547.         if Err.number <> 0 then
  548.             ServeFailurePage L_FAILEDTORETRIEVEMEMBERS_ERRORMESSAGE & "(" & Hex(Err.number) & ")"
  549.         End if
  550.  
  551.         getLocalUsersListEx = strGroupsNUsers
  552.     End Function
  553.  
  554.     '-----------------------------------------------------------------------------------
  555.     'Function name        : Getbuiltingroups
  556.     'Description        : Serves in getting BUILTIN groups  and writes into
  557.     '                      a select box.
  558.     'Input Variables    Object            G_objService    
  559.     'Output Variables    
  560.     '                    Boolean            -Returns True/False on Success/Failure
  561.     'Global Variables    
  562.     '                    L_* (in)        -Localized strings
  563.     '-----------------------------------------------------------------------------------    
  564.     Function Getbuiltingroups(objService)
  565.  
  566.         Err.Clear
  567.         
  568.         Dim objCollection
  569.         Dim objInstance
  570.         Dim strQuery
  571.         Dim strBuiltinGroups
  572.         Dim Domainname
  573.         
  574.         Domainname = getBuiltinDomainName(objService)
  575.         strBuiltinGroups =""
  576.         strQuery = "SELECT * From Win32_Group WHERE Domain=" & "'" & Domainname & "'"
  577.         Set objCollection = objService.ExecQuery(strQuery)
  578.         If  objCollection.Count = 0 then
  579.             Exit function
  580.         End if
  581.         For each objInstance in objCollection
  582.             strBuiltinGroups = strBuiltinGroups & chr(1)& Domainname & "\" & objInstance.Name & chr(2)& objInstance.Name
  583.         Next
  584.         Set objCollection = Nothing    
  585.         Getbuiltingroups = strBuiltinGroups
  586.     End Function 
  587.  
  588.  
  589. %>
  590.